"""
FastAPI主应用
创建时间：2025-09-12
作者：开发团队
目的：FastAPI应用入口和配置
"""

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from .core.database import engine, Base, SessionLocal
from .core.config import get_config
from .api import auth, verification, admin, superadmin
from .utils.logger import get_logger

from .core.security import get_password_hash

# 导入所有模型以确保在创建数据库表时能找到所有相关的表
from .models.user import User

# 获取配置和日志记录器
config = get_config()
logger = get_logger(__name__)


def create_default_admin():
    """
    创建默认管理员账户
    """
    db = SessionLocal()
    try:
        # 检查是否已存在管理员账户
        admin_user = db.query(User).filter(User.username == "admin").first()
        if not admin_user:
            # 创建默认管理员账户
            admin_user = User(
                username="admin",
                password_hash=get_password_hash("admin123"),
                name="系统管理员",
                role="superadmin",
                status="active"
            )
            db.add(admin_user)
            db.commit()
            logger.info("默认管理员账户创建成功: username=admin, password=admin123")
        else:
            logger.info("默认管理员账户已存在")
    except Exception as e:
        db.rollback()
        logger.error(f"创建默认管理员账户失败: {str(e)}")
    finally:
        db.close()


@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    应用生命周期管理
    :param app: FastAPI应用实例
    """
    # 启动时执行
    logger.info("正在初始化数据库...")
    Base.metadata.create_all(bind=engine)
    logger.info("数据库初始化完成")
    
    # 创建默认管理员账户
    create_default_admin()
    
    yield
    
    # 关闭时执行
    logger.info("应用正在关闭...")


# 创建FastAPI应用实例
app = FastAPI(
    title=config.PROJECT_NAME,
    version=config.VERSION,
    lifespan=lifespan
)

# 添加CORS中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 在生产环境中应该指定具体的域名
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 包含路由
app.include_router(auth.router, prefix=config.API_V1_STR)
app.include_router(verification.router, prefix=config.API_V1_STR)
app.include_router(admin.router, prefix=config.API_V1_STR)
app.include_router(superadmin.router, prefix=config.API_V1_STR)


@app.get("/")
async def root():
    """
    根路径
    :return: 欢迎信息
    """
    return {"message": "欢迎使用新易访内网系统API", "version": config.VERSION}


@app.get("/health")
async def health_check():
    """
    健康检查端点
    :return: 健康状态
    """
    return {"status": "healthy"}